home *** CD-ROM | disk | FTP | other *** search
- {===========================================================================
- BBS: Canada Remote Systems
- From: RYAN THOMPSON
- Subj: RE: COMMAND LINE PARSING
-
- >>> Quoting from Chet Kress to Frans Van Duinen about Command Line Parsing
-
- CK> FVD>I want to pass to my BP 7 program a few parameters, one of which
- CK> FVD>has embedded (or even trailing) blanks. The naive approach of
- CK> FVD>PROCFAX PROCFAX.CFG \PCB\MAIN\MSGS58 "FAX MAIL" does not work.
- CK> FVD>Currently I pick up FAX and MAIL as two parameters and
- CK> FVD>string, but I want to allow multiple embedded/trailing blanks.
-
- Here's a set of routines to do just what you want.
-
- Parameters Returns the number of parameters on the command line. Does
- not include switches.
- Parameter(n) Returns the nth parameter, ignoring switches and passing
- strings in quotes as " or ' followed by the entire string
- including any imbedded spaces.
- SwitchThere(x) Returns True if the switch specified by the character
- passed is present on the command line.
- SwitchData(x) Returns the data following the switch character if the
- switch character specified is present on the command line.
- SwitchNum(x) Returns the position on the command line of the switch
- specified. Skips parameters. }
-
-
- Function SwitchNum(S : String) : Integer;
- Var
- Temp : String;
- X,
- Y : Integer;
- Begin
- Temp:= '';
- X:= ParamCount;
- Y:= 0;
- while (X > 0) and (Y = 0) do begin
- Temp:= ParamStr(X);
- if (Temp[1] = '/') or (Temp[1] = '-') then
- if UpCase(Temp[2]) = UpString(S) then Y:= X;
- Dec(X);
- end;
- SwitchNum:= Y;
- End;
-
-
- Function SwitchThere(S : String) : Boolean;
- Begin
- SwitchThere:= not (SwitchNum(S) = 0);
- End;
-
-
- Function SwitchData(S : String) : String;
- Var
- Temp : String;
- Begin
- If SwitchNum(S) > 0 then begin
- Temp:= ParamStr(SwitchNum(S));
- Delete(Temp, 1, 2);
- end
- else Temp:= '';
- SwitchData:= Temp;
- End;
-
-
- Function Parameter(N : Byte) : String;
- Var
- X,
- Count : Byte;
- Parm,
- Temp : String;
- Begin
- X:= 0;
- Count:= 0;
- Parm:= '';
- If ParamCount > 0 then repeat
- Inc(X);
- Temp:= ParamStr(X);
- If (Temp[1] = '"') or (Temp[1] = '''') then begin
- Parm:= Temp;
- If X < ParamCount then repeat
- Inc(X);
- Parm:= Parm + ' ' + ParamStr(X);
- until (Parm[Length(Parm)] = '"') or
- (Parm[Length(Parm)] = '''') or (X = ParamCount);
- Inc(Count);
- end
- else if (Temp[1] <> '/') and (Temp[1] <> '-')
- then begin
- Inc(Count);
- Parm:= Temp;
- end;
- until (X = ParamCount) or (Count = N);
- If Count = N then Parameter:= Parm
- else Parameter:= '';
- End;
-
-
- Function Parameters : Byte;
- Var
- X : Byte;
- Begin
- X:= 0;
- If ParamCount > 0 then begin
- Repeat
- Inc(X)
- Until Parameter(X) = '';
- Parameters:= X - 1;
- end
- else Parameters:= 0;
- End;
-
- {
- For example, the command line:
-
- TESTPRG /C INPUT.DAT /X67 "first one"
-
- Parameters returns 2
- Parameter(1) returns INPUT.DAT
- Parameter(2) returns "first one
- SwitchThere('F') returns false
- SwitchData('X') returns 67
-
- Notice that in quoted parameters, the first quote is returned- this allows
- you to check for " vs. ', which you could use as the difference between case
- sensitive and non-case-sensitive. A simple Delete(S,1,1) can remove it from
- the string for use. }